This notebook generates plots for all Studies.

source("../scripts_general/dependencies.R")
There were 26 warnings (use warnings() to see them)
source("../scripts_general/custom_funs.R")
source("../scripts_general/var_recode_contrast.R")
source("../scripts_general/data_load.R")
# rescale to 0-1
d1_fig <- d1 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/1,
         pv_score = pv_score/3,
         abs_score = abs_score/1)

d2_fig <- d2 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/1,
         por_score = por_score/1)

d3_fig <- d3 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/4,
         dse_score = dse_score/5,
         abs_score = abs_score/1)

d4_fig <- d4 %>%
  filter(!is.na(country)) %>%
  mutate(spev_score = spev_score/4,
         dse_score = dse_score/5,
         pv_score = pv_score/3,
         por_score = por_score/2,
         abs_score = abs_score/1,
         hall_score = hall_score/3,
         para_score = para_score/1,
         cog_score = (cog_score + 2)/4,
         ctl_score = (ctl_score + 3)/6)

Figure 1

d_sum_s1 <- d1_fig %>%
  mutate(religion = recode_factor(
    religion,
    "local" = "Faith of local salience",
    "charismatic" = "Charismatic evangelical Christianity")) %>%
  group_by(country, religion, site) %>%
  summarise_at(vars(spev_score, pv_score, abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
d_width <- 0.8
fig1_row1 <- d1_fig %>% 
  mutate(religion = recode_factor(
    religion,
    "local" = "Faith of local salience",
    "charismatic" = "Charismatic evangelical Christianity")) %>%
  ggplot(aes(x = country, y = spev_score, 
             color = country, fill = country, 
             shape = site)) +
  facet_grid(~ religion) +
  geom_point(position = position_jitterdodge(jitter.width = d_width/1.5,
                                             jitter.height = 0,
                                             dodge.width = d_width), 
             alpha = 0.25, show.legend = F) +
  geom_pointrange(data = . %>%
                    group_by(country, religion, site) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  position = position_dodge(width = d_width),
                  color = "black") +
  geom_text(data = d_sum_s1 %>%
              mutate_at(vars(-country, -religion, -site), 
                        funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(spev_score_mean, "\n(", spev_score_sd, ")")),
            position = position_dodge(width = d_width),
            color = "black", size = 2.5, vjust = 1) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  scale_shape_manual(values = 21:24) +
  scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25)) +
  theme(legend.position = "bottom") +
  guides(color = F, fill = F, 
         shape = guide_legend(override.aes = list(fill = "black"))) +
  labs(x = "Country", y = "Spiritual Events", shape = "Site")
fig1_title <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 35))

fig1 <- plot_grid(
  fig1_title,
  plot_grid(fig1_row1, 
            ncol = 1),
  ncol = 1, rel_heights = c(1, 20))
Removed 4 rows containing missing values (geom_point).
ggsave("./png_files/fig1.png", plot = fig1, device = "png", width = 9, height = 9 * 0.5)
fig1

Spiritual Events scores, by religion, country, and site in Study 1, rescaled to range from 0-1. Small points correspond to individual participants, larger points are means, and error bars are ±1 standard deviation; means (and standard deviations) are also provided. Local religions were as follows—US: Methodism; Ghana: African traditional religion; Thailand: Buddhism; urban China: Buddhism; rural China: spirit mediumship; urban Vanuatu: Presbyterianism; rural Vanuatu: ancestral kastom practices.

Figure 2

fig2_fun <- function(g){
  new_plot <- g +
    geom_point(aes(color = country), alpha = 0.1) +
    geom_smooth(aes(color = country), method = "lm", 
                lty = 2, size = 0.7, alpha = 0, show.legend = F) +
    geom_smooth(method = "lm", color = "black", alpha = 0.7) +
    scale_color_brewer(palette = "Dark2") +
    xlim(0, 1) +
    ylim(0, 1) +
    theme(legend.position = "none") +
    guides(color = guide_legend(override.aes = list(alpha = 1)))
  
  return(new_plot)
}
fig2_study1_pv <- d1_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Spiritual Events",
       color = "Country")

fig2_study1_abs <- d1_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")

fig2_study2_por <- d2_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Spiritual Events",
       color = "Country")

fig2_study3_abs <- d3_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")

fig2_study4_pv <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Spiritual Events",
       color = "Country")

fig2_study4_por <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Spiritual Events",
       color = "Country")

fig2_study4_abs <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = spev_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Spiritual Events",
       color = "Country")
fig2_study1_title <- ggdraw() + 
  draw_label("STUDY 1", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_row1 <- plot_grid(
  fig2_study1_title,
  plot_grid(fig2_study1_pv, fig2_study1_abs, ncol = 2, labels = c("A", "B")),
  ncol = 1, rel_heights = c(1, 10))
`geom_smooth()` using formula 'y ~ x'
Removed 20 rows containing non-finite values (stat_smooth).`geom_smooth()` using formula 'y ~ x'
Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing missing values (geom_point).`geom_smooth()` using formula 'y ~ x'
Removed 28 rows containing non-finite values (stat_smooth).`geom_smooth()` using formula 'y ~ x'
Removed 28 rows containing non-finite values (stat_smooth).Removed 28 rows containing missing values (geom_point).
fig2_study2_title <- ggdraw() + 
  draw_label("STUDY 2", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_study3_title <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_row2 <- plot_grid(
  plot_grid(fig2_study2_title, fig2_study3_title),
  plot_grid(fig2_study2_por, fig2_study3_abs, 
            ncol = 2, labels = c("C", "D")),
  ncol = 1, rel_heights = c(1, 10))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
Removed 10 rows containing missing values (geom_smooth).
fig2_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

fig2_row3 <- plot_grid(
  fig2_study4_title,
  plot_grid(plot_grid(fig2_study4_pv, fig2_study4_por, 
                      ncol = 1, labels = c("E", "F")), 
            plot_grid(NULL, fig2_study4_abs, NULL, 
                      ncol = 1, rel_heights = c(1, 2, 1), labels = c("", "G", "")), 
            ncol = 2),
  ncol = 1, rel_heights = c(1, 20))
`geom_smooth()` using formula 'y ~ x'
Removed 2 rows containing non-finite values (stat_smooth).`geom_smooth()` using formula 'y ~ x'
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).`geom_smooth()` using formula 'y ~ x'
Removed 2 rows containing non-finite values (stat_smooth).`geom_smooth()` using formula 'y ~ x'
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).`geom_smooth()` using formula 'y ~ x'
Removed 2 rows containing non-finite values (stat_smooth).`geom_smooth()` using formula 'y ~ x'
Removed 2 rows containing non-finite values (stat_smooth).Removed 2 rows containing missing values (geom_point).Removed 11 rows containing missing values (geom_smooth).
fig_legend <- get_legend(fig2_study1_pv + theme(legend.position = "bottom"))
`geom_smooth()` using formula 'y ~ x'
Removed 20 rows containing non-finite values (stat_smooth).`geom_smooth()` using formula 'y ~ x'
Removed 20 rows containing non-finite values (stat_smooth).Removed 20 rows containing missing values (geom_point).
fig2 <- plot_grid(fig2_row1, fig2_row2, fig2_row3, fig_legend,
                  ncol = 1, rel_heights = c(1, 1, 2, 0.2))

ggsave("./png_files/fig2.png", plot = fig2, device = "png", width = 6, height = 6 * 2.1)
fig2

Relationships between Spiritual Events scores and scores on measures of porosity (left) and absorption (right), by study and country, rescaled to range from 0-1. Small colored points correspond to individual participants, dotted colored lines correspond to the trend within each country, and solid black lines correspond to the overall trend collapsing across countries. See Fig. S1 for a parallel visualization of Daily Spiritual Experience scores in Studies 3-4.

Figure 3

fig3_fun <- function(g){
  new_plot <- g +
    geom_jitter(height = 0, width = 0.25, alpha = 0.2, show.legend = F ) +
    scale_color_brewer(palette = "Dark2") +
    scale_fill_brewer(palette = "Dark2") +
    scale_y_continuous(limits = c(NA, 1), breaks = seq(0, 1, 0.25))
  
  return(new_plot)
}
d_sum_s4 <- d4_fig %>%
  group_by(country) %>%
  summarise_at(vars(spev_score, dse_score, pv_score, por_score, abs_score),
               funs(mean = mean(., na.rm = T), sd = sd(., na.rm = T))) %>%
  ungroup()
fig3_spev <- d4_fig %>%
  ggplot(aes(x = country, y = spev_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(spev_score, na.rm = T),
                              sd = sd(spev_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(spev_score_mean, "\n(", spev_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Spiritual Events")
fig3_dse <- d4_fig %>%
  ggplot(aes(x = country, y = dse_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(dse_score, na.rm = T),
                              sd = sd(dse_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(dse_score_mean, "\n(", dse_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Daily Spiritual Experience")
fig3_pv <- d4_fig %>%
  ggplot(aes(x = country, y = pv_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(pv_score, na.rm = T),
                              sd = sd(pv_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(pv_score_mean, "\n(", pv_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Porosity Vignettes")
fig3_por <- d4_fig %>%
  ggplot(aes(x = country, y = por_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(por_score, na.rm = T),
                              sd = sd(por_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(por_score_mean, "\n(", por_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Porosity Scale")
fig3_abs <- d4_fig %>%
  ggplot(aes(x = country, y = abs_score, color = country, fill = country)) %>%
  fig3_fun() +
  geom_pointrange(data = . %>%
                    group_by(country) %>%
                    summarise(mean = mean(abs_score, na.rm = T),
                              sd = sd(abs_score, na.rm = T)) %>%
                    ungroup(),
                  aes(y = mean, ymin = mean - sd, ymax = mean + sd),
                  shape = 23, color = "black",
                  show.legend = F) +
  geom_text(data = d_sum_s4 %>%
              mutate_at(vars(-country), funs(format(round(., 2), nsmall = 2))),
            aes(y = 1, label = paste0(abs_score_mean, "\n(", abs_score_sd, ")")),
            color = "black", size = 2.5, vjust = 1) +
  labs(x = "Country", y = "Absorption")
fig3_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0.5) +
  theme(plot.margin = margin(0, 0, 0, 35))

fig3 <- plot_grid(
  fig3_study4_title,
  plot_grid(fig3_spev, fig3_dse, 
            fig3_pv, fig3_por, 
            fig3_abs, NULL, 
            ncol = 2, labels = c("A", "B", "C", "D", "E")),
  ncol = 1, rel_heights = c(1, 20))
Removed 2 rows containing missing values (geom_point).
ggsave("./png_files/fig3.png", plot = fig3, device = "png", width = 7, height = 7 * 1.5)
fig3

Scores on measures of spiritual experience (A-B), porosity (C-D) and absorption (E) in Study 4, rescaled to range from 0-1. Small points correspond to individual participants, larger points are means, and error bars are ±1 standard deviation; means (and standard deviations) are also provided.

Figure S1

figs1_study3_abs <- d3_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Daily Spiritual Experience",
       color = "Country")

figs1_study4_pv <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Daily Spiritual Experience",
       color = "Country")

figs1_study4_por <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Daily Spiritual Experience",
       color = "Country")

figs1_study4_abs <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = dse_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Daily Spiritual Experience",
       color = "Country")
figs1_study3_title <- ggdraw() + 
  draw_label("STUDY 3", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

figs1_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

figs1_row1 <- plot_grid(
  plot_grid(figs1_study4_title, figs1_study3_title),
  plot_grid(figs1_study4_pv, figs1_study3_abs, ncol = 2, labels = c("A", "B")),
  plot_grid(figs1_study4_title, figs1_study4_title),
  plot_grid(figs1_study4_por, figs1_study4_abs, ncol = 2, labels = c("C", "D")),
  ncol = 1, rel_heights = c(1, 10, 1, 10))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
fig_legend <- get_legend(figs1_study4_pv + theme(legend.position = "bottom"))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
figs1 <- plot_grid(figs1_row1, fig_legend,
                   ncol = 1, rel_heights = c(2, 0.2))

ggsave("./png_files/figs1.png", plot = figs1, device = "png", width = 6, height = 6 * 1.2)
figs1

Relationships between Daily Spiritual Experience scores and scores on our measures of porosity (left side) and absorption (right side), by study and country, rescaled to range from 0-1. Small colored points correspond to individual participants, dotted colored lines correspond to the trend within each country, and solid black lines correspond to the overall trend, collapsing across countries.

Figure S2

figs2_study4_pv_hall <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = hall_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Hallucinations",
       color = "Country")

figs2_study4_por_hall <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = hall_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Hallucinations",
       color = "Country")

figs2_study4_abs_hall <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = hall_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Hallucinations",
       color = "Country")

figs2_study4_pv_para <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = pv_score, y = para_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Vignettes",
       y = "Paranormal",
       color = "Country")

figs2_study4_por_para <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = por_score, y = para_score)) %>%
  fig2_fun() +
  labs(x = "Porosity Scale",
       y = "Paranormal",
       color = "Country")

figs2_study4_abs_para <- d4_fig %>%
  # mutate_at(vars(ends_with("_score")), scale) %>%
  ggplot(aes(x = abs_score, y = para_score)) %>%
  fig2_fun() +
  labs(x = "Absorption",
       y = "Paranormal",
       color = "Country")
figs2_study4_title <- ggdraw() + 
  draw_label("STUDY 4", fontface = 'bold', x = 0, hjust = 0) +
  theme(plot.margin = margin(0, 0, 0, 7))

figs2_row1 <- plot_grid(
  plot_grid(figs2_study4_title),
  plot_grid(figs2_study4_pv_hall, figs2_study4_por_hall, figs2_study4_abs_hall,
            ncol = 3, labels = c("A", "B", "C")),
  plot_grid(figs2_study4_pv_para, figs2_study4_por_para, figs2_study4_abs_para,
            ncol = 3, labels = c("D", "E", "F")),
  ncol = 1, rel_heights = c(1, 10, 10))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
fig_legend <- get_legend(figs2_study4_pv_para + theme(legend.position = "bottom"))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
figs2 <- plot_grid(figs2_row1, fig_legend,
                   ncol = 1, rel_heights = c(3, 0.2))

ggsave("./png_files/figs2.png", plot = figs2, device = "png", width = 9, height = 9 * 0.7)
figs2

Relationships between Paranormal scores and scores on our measures of porosity (left side) and absorption (right side), by study and country, rescaled to range from 0-1. Small colored points correspond to individual participants, dotted colored lines correspond to the trend within each country, and solid black lines correspond to the overall trend, collapsing across countries.

LS0tCnRpdGxlOiAiRmlndXJlcyIKc3VidGl0bGU6ICJMdWhybWFubiwgV2Vpc21hbiwgZXQgYWwuIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KClRoaXMgbm90ZWJvb2sgZ2VuZXJhdGVzIHBsb3RzIGZvciBhbGwgU3R1ZGllcy4KCmBgYHtyLCBtZXNzYWdlID0gRn0Kc291cmNlKCIuLi9zY3JpcHRzX2dlbmVyYWwvZGVwZW5kZW5jaWVzLlIiKQpzb3VyY2UoIi4uL3NjcmlwdHNfZ2VuZXJhbC9jdXN0b21fZnVucy5SIikKc291cmNlKCIuLi9zY3JpcHRzX2dlbmVyYWwvdmFyX3JlY29kZV9jb250cmFzdC5SIikKc291cmNlKCIuLi9zY3JpcHRzX2dlbmVyYWwvZGF0YV9sb2FkLlIiKQpgYGAKCmBgYHtyfQojIHJlc2NhbGUgdG8gMC0xCmQxX2ZpZyA8LSBkMSAlPiUKICBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKSAlPiUKICBtdXRhdGUoc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvMSwKICAgICAgICAgcHZfc2NvcmUgPSBwdl9zY29yZS8zLAogICAgICAgICBhYnNfc2NvcmUgPSBhYnNfc2NvcmUvMSkKCmQyX2ZpZyA8LSBkMiAlPiUKICBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKSAlPiUKICBtdXRhdGUoc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvMSwKICAgICAgICAgcG9yX3Njb3JlID0gcG9yX3Njb3JlLzEpCgpkM19maWcgPC0gZDMgJT4lCiAgZmlsdGVyKCFpcy5uYShjb3VudHJ5KSkgJT4lCiAgbXV0YXRlKHNwZXZfc2NvcmUgPSBzcGV2X3Njb3JlLzQsCiAgICAgICAgIGRzZV9zY29yZSA9IGRzZV9zY29yZS81LAogICAgICAgICBhYnNfc2NvcmUgPSBhYnNfc2NvcmUvMSkKCmQ0X2ZpZyA8LSBkNCAlPiUKICBmaWx0ZXIoIWlzLm5hKGNvdW50cnkpKSAlPiUKICBtdXRhdGUoc3Bldl9zY29yZSA9IHNwZXZfc2NvcmUvNCwKICAgICAgICAgZHNlX3Njb3JlID0gZHNlX3Njb3JlLzUsCiAgICAgICAgIHB2X3Njb3JlID0gcHZfc2NvcmUvMywKICAgICAgICAgcG9yX3Njb3JlID0gcG9yX3Njb3JlLzIsCiAgICAgICAgIGFic19zY29yZSA9IGFic19zY29yZS8xLAogICAgICAgICBoYWxsX3Njb3JlID0gaGFsbF9zY29yZS8zLAogICAgICAgICBwYXJhX3Njb3JlID0gcGFyYV9zY29yZS8xLAogICAgICAgICBjb2dfc2NvcmUgPSAoY29nX3Njb3JlICsgMikvNCwKICAgICAgICAgY3RsX3Njb3JlID0gKGN0bF9zY29yZSArIDMpLzYpCmBgYAoKCiMgRmlndXJlIDEKCmBgYHtyfQpkX3N1bV9zMSA8LSBkMV9maWcgJT4lCiAgbXV0YXRlKHJlbGlnaW9uID0gcmVjb2RlX2ZhY3RvcigKICAgIHJlbGlnaW9uLAogICAgImxvY2FsIiA9ICJGYWl0aCBvZiBsb2NhbCBzYWxpZW5jZSIsCiAgICAiY2hhcmlzbWF0aWMiID0gIkNoYXJpc21hdGljIGV2YW5nZWxpY2FsIENocmlzdGlhbml0eSIpKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCByZWxpZ2lvbiwgc2l0ZSkgJT4lCiAgc3VtbWFyaXNlX2F0KHZhcnMoc3Bldl9zY29yZSwgcHZfc2NvcmUsIGFic19zY29yZSksCiAgICAgICAgICAgICAgIGZ1bnMobWVhbiA9IG1lYW4oLiwgbmEucm0gPSBUKSwgc2QgPSBzZCguLCBuYS5ybSA9IFQpKSkgJT4lCiAgdW5ncm91cCgpCmBgYAoKYGBge3J9CmRfd2lkdGggPC0gMC44CmZpZzFfcm93MSA8LSBkMV9maWcgJT4lIAogIG11dGF0ZShyZWxpZ2lvbiA9IHJlY29kZV9mYWN0b3IoCiAgICByZWxpZ2lvbiwKICAgICJsb2NhbCIgPSAiRmFpdGggb2YgbG9jYWwgc2FsaWVuY2UiLAogICAgImNoYXJpc21hdGljIiA9ICJDaGFyaXNtYXRpYyBldmFuZ2VsaWNhbCBDaHJpc3RpYW5pdHkiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgeSA9IHNwZXZfc2NvcmUsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwgCiAgICAgICAgICAgICBzaGFwZSA9IHNpdGUpKSArCiAgZmFjZXRfZ3JpZCh+IHJlbGlnaW9uKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKGppdHRlci53aWR0aCA9IGRfd2lkdGgvMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXIuaGVpZ2h0ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9kZ2Uud2lkdGggPSBkX3dpZHRoKSwgCiAgICAgICAgICAgICBhbHBoYSA9IDAuMjUsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5LCByZWxpZ2lvbiwgc2l0ZSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNwZXZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2Qoc3Bldl9zY29yZSwgbmEucm0gPSBUKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpLAogICAgICAgICAgICAgICAgICBhZXMoeSA9IG1lYW4sIHltaW4gPSBtZWFuIC0gc2QsIHltYXggPSBtZWFuICsgc2QpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gZF93aWR0aCksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZF9zdW1fczEgJT4lCiAgICAgICAgICAgICAgbXV0YXRlX2F0KHZhcnMoLWNvdW50cnksIC1yZWxpZ2lvbiwgLXNpdGUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoc3Bldl9zY29yZV9tZWFuLCAiXG4oIiwgc3Bldl9zY29yZV9zZCwgIikiKSksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSBkX3dpZHRoKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAyMToyNCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3IgPSBGLCBmaWxsID0gRiwgCiAgICAgICAgIHNoYXBlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QoZmlsbCA9ICJibGFjayIpKSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwgc2hhcGUgPSAiU2l0ZSIpCmBgYAoKYGBge3J9CmZpZzFfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSAxIiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDAuNSkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDM1KSkKCmZpZzEgPC0gcGxvdF9ncmlkKAogIGZpZzFfdGl0bGUsCiAgcGxvdF9ncmlkKGZpZzFfcm93MSwgCiAgICAgICAgICAgIG5jb2wgPSAxKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIwKSkKCmdnc2F2ZSgiLi9wbmdfZmlsZXMvZmlnMS5wbmciLCBwbG90ID0gZmlnMSwgZGV2aWNlID0gInBuZyIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSAqIDAuNSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNC41LCBmaWcuYXNwID0gMC41fQpmaWcxCmBgYAoKU3Bpcml0dWFsIEV2ZW50cyBzY29yZXMsIGJ5IHJlbGlnaW9uLCBjb3VudHJ5LCBhbmQgc2l0ZSBpbiBTdHVkeSAxLCByZXNjYWxlZCB0byByYW5nZSBmcm9tIDAtMS4gU21hbGwgcG9pbnRzIGNvcnJlc3BvbmQgdG8gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMsIGxhcmdlciBwb2ludHMgYXJlIG1lYW5zLCBhbmQgZXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbjsgbWVhbnMgKGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zKSBhcmUgYWxzbyBwcm92aWRlZC4gTG9jYWwgcmVsaWdpb25zIHdlcmUgYXMgZm9sbG93c+KAlFVTOiBNZXRob2Rpc207IEdoYW5hOiBBZnJpY2FuIHRyYWRpdGlvbmFsIHJlbGlnaW9uOyBUaGFpbGFuZDogQnVkZGhpc207IHVyYmFuIENoaW5hOiBCdWRkaGlzbTsgcnVyYWwgQ2hpbmE6IHNwaXJpdCBtZWRpdW1zaGlwOyB1cmJhbiBWYW51YXR1OiBQcmVzYnl0ZXJpYW5pc207IHJ1cmFsIFZhbnVhdHU6IGFuY2VzdHJhbCBrYXN0b20gcHJhY3RpY2VzLgoKCiMgRmlndXJlIDIKCmBgYHtyfQpmaWcyX2Z1biA8LSBmdW5jdGlvbihnKXsKICBuZXdfcGxvdCA8LSBnICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSksIGFscGhhID0gMC4xKSArCiAgICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxtIiwgCiAgICAgICAgICAgICAgICBsdHkgPSAyLCBzaXplID0gMC43LCBhbHBoYSA9IDAsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNykgKwogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICB4bGltKDAsIDEpICsKICAgIHlsaW0oMCwgMSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkKICAKICByZXR1cm4obmV3X3Bsb3QpCn0KYGBgCgpgYGB7cn0KZmlnMl9zdHVkeTFfcHYgPC0gZDFfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwdl9zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZzJfc3R1ZHkxX2FicyA8LSBkMV9maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWcyX3N0dWR5Ml9wb3IgPC0gZDJfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3Jfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgIHkgPSAiU3Bpcml0dWFsIEV2ZW50cyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZzJfc3R1ZHkzX2FicyA8LSBkM19maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXZfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWcyX3N0dWR5NF9wdiA8LSBkNF9maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IHB2X3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICU+JQogIGZpZzJfZnVuKCkgKwogIGxhYnMoeCA9ICJQb3Jvc2l0eSBWaWduZXR0ZXMiLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQoKZmlnMl9zdHVkeTRfcG9yIDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcG9yX3Njb3JlLCB5ID0gc3Bldl9zY29yZSkpICU+JQogIGZpZzJfZnVuKCkgKwogIGxhYnMoeCA9ICJQb3Jvc2l0eSBTY2FsZSIsCiAgICAgICB5ID0gIlNwaXJpdHVhbCBFdmVudHMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWcyX3N0dWR5NF9hYnMgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBzcGV2X3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIkFic29ycHRpb24iLAogICAgICAgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQpgYGAKCmBgYHtyfQpmaWcyX3N0dWR5MV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlNUVURZIDEiLCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDcpKQoKZmlnMl9yb3cxIDwtIHBsb3RfZ3JpZCgKICBmaWcyX3N0dWR5MV90aXRsZSwKICBwbG90X2dyaWQoZmlnMl9zdHVkeTFfcHYsIGZpZzJfc3R1ZHkxX2FicywgbmNvbCA9IDIsIGxhYmVscyA9IGMoIkEiLCAiQiIpKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwKSkKYGBgCgpgYGB7cn0KZmlnMl9zdHVkeTJfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSAyIiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZzJfc3R1ZHkzX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMyIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWcyX3JvdzIgPC0gcGxvdF9ncmlkKAogIHBsb3RfZ3JpZChmaWcyX3N0dWR5Ml90aXRsZSwgZmlnMl9zdHVkeTNfdGl0bGUpLAogIHBsb3RfZ3JpZChmaWcyX3N0dWR5Ml9wb3IsIGZpZzJfc3R1ZHkzX2FicywgCiAgICAgICAgICAgIG5jb2wgPSAyLCBsYWJlbHMgPSBjKCJDIiwgIkQiKSksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxMCkpCmBgYAoKYGBge3J9CmZpZzJfc3R1ZHk0X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgNCIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWcyX3JvdzMgPC0gcGxvdF9ncmlkKAogIGZpZzJfc3R1ZHk0X3RpdGxlLAogIHBsb3RfZ3JpZChwbG90X2dyaWQoZmlnMl9zdHVkeTRfcHYsIGZpZzJfc3R1ZHk0X3BvciwgCiAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgbGFiZWxzID0gYygiRSIsICJGIikpLCAKICAgICAgICAgICAgcGxvdF9ncmlkKE5VTEwsIGZpZzJfc3R1ZHk0X2FicywgTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDIsIDEpLCBsYWJlbHMgPSBjKCIiLCAiRyIsICIiKSksIAogICAgICAgICAgICBuY29sID0gMiksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAyMCkpCmBgYAoKYGBge3J9CmZpZ19sZWdlbmQgPC0gZ2V0X2xlZ2VuZChmaWcyX3N0dWR5MV9wdiArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKYGBgCgpgYGB7cn0KZmlnMiA8LSBwbG90X2dyaWQoZmlnMl9yb3cxLCBmaWcyX3JvdzIsIGZpZzJfcm93MywgZmlnX2xlZ2VuZCwKICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxLCAyLCAwLjIpKQoKZ2dzYXZlKCIuL3BuZ19maWxlcy9maWcyLnBuZyIsIHBsb3QgPSBmaWcyLCBkZXZpY2UgPSAicG5nIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA2ICogMi4xKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMi4xfQpmaWcyCmBgYAoKUmVsYXRpb25zaGlwcyBiZXR3ZWVuIFNwaXJpdHVhbCBFdmVudHMgc2NvcmVzIGFuZCBzY29yZXMgb24gbWVhc3VyZXMgb2YgcG9yb3NpdHkgKGxlZnQpIGFuZCBhYnNvcnB0aW9uIChyaWdodCksIGJ5IHN0dWR5IGFuZCBjb3VudHJ5LCByZXNjYWxlZCB0byByYW5nZSBmcm9tIDAtMS4gU21hbGwgY29sb3JlZCBwb2ludHMgY29ycmVzcG9uZCB0byBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cywgZG90dGVkIGNvbG9yZWQgbGluZXMgY29ycmVzcG9uZCB0byB0aGUgdHJlbmQgd2l0aGluIGVhY2ggY291bnRyeSwgYW5kIHNvbGlkIGJsYWNrIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwgdHJlbmQgY29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzLiBTZWUgRmlnLiBTMSBmb3IgYSBwYXJhbGxlbCB2aXN1YWxpemF0aW9uIG9mIERhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlIHNjb3JlcyBpbiBTdHVkaWVzIDMtNC4KCgojIEZpZ3VyZSAzCgpgYGB7cn0KZmlnM19mdW4gPC0gZnVuY3Rpb24oZyl7CiAgbmV3X3Bsb3QgPC0gZyArCiAgICBnZW9tX2ppdHRlcihoZWlnaHQgPSAwLCB3aWR0aCA9IDAuMjUsIGFscGhhID0gMC4yLCBzaG93LmxlZ2VuZCA9IEYgKSArCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhOQSwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkKICAKICByZXR1cm4obmV3X3Bsb3QpCn0KYGBgCgpgYGB7cn0KZF9zdW1fczQgPC0gZDRfZmlnICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcmlzZV9hdCh2YXJzKHNwZXZfc2NvcmUsIGRzZV9zY29yZSwgcHZfc2NvcmUsIHBvcl9zY29yZSwgYWJzX3Njb3JlKSwKICAgICAgICAgICAgICAgZnVucyhtZWFuID0gbWVhbiguLCBuYS5ybSA9IFQpLCBzZCA9IHNkKC4sIG5hLnJtID0gVCkpKSAlPiUKICB1bmdyb3VwKCkKYGBgCgpgYGB7cn0KZmlnM19zcGV2IDwtIGQ0X2ZpZyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gc3Bldl9zY29yZSwgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSkpICU+JQogIGZpZzNfZnVuKCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc3Bldl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChzcGV2X3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkX3N1bV9zNCAlPiUKICAgICAgICAgICAgICBtdXRhdGVfYXQodmFycygtY291bnRyeSksIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpLAogICAgICAgICAgICBhZXMoeSA9IDEsIGxhYmVsID0gcGFzdGUwKHNwZXZfc2NvcmVfbWVhbiwgIlxuKCIsIHNwZXZfc2NvcmVfc2QsICIpIikpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIHZqdXN0ID0gMSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJTcGlyaXR1YWwgRXZlbnRzIikKYGBgCgpgYGB7cn0KZmlnM19kc2UgPC0gZDRfZmlnICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBkc2Vfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSAlPiUKICBmaWczX2Z1bigpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGRzZV9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChkc2Vfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3VtX3M0ICU+JQogICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKC1jb3VudHJ5KSwgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAoZHNlX3Njb3JlX21lYW4sICJcbigiLCBkc2Vfc2NvcmVfc2QsICIpIikpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIHZqdXN0ID0gMSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZSIpCmBgYAoKYGBge3J9CmZpZzNfcHYgPC0gZDRfZmlnICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBwdl9zY29yZSwgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSkpICU+JQogIGZpZzNfZnVuKCkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUKICAgICAgICAgICAgICAgICAgICBncm91cF9ieShjb3VudHJ5KSAlPiUKICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocHZfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QocHZfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3VtX3M0ICU+JQogICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKC1jb3VudHJ5KSwgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAocHZfc2NvcmVfbWVhbiwgIlxuKCIsIHB2X3Njb3JlX3NkLCAiKSIpKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiUG9yb3NpdHkgVmlnbmV0dGVzIikKYGBgCgpgYGB7cn0KZmlnM19wb3IgPC0gZDRfZmlnICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIHkgPSBwb3Jfc2NvcmUsIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnkpKSAlPiUKICBmaWczX2Z1bigpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lCiAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBvcl9zY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChwb3Jfc2NvcmUsIG5hLnJtID0gVCkpICU+JQogICAgICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gbWVhbiAtIHNkLCB5bWF4ID0gbWVhbiArIHNkKSwKICAgICAgICAgICAgICAgICAgc2hhcGUgPSAyMywgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3VtX3M0ICU+JQogICAgICAgICAgICAgIG11dGF0ZV9hdCh2YXJzKC1jb3VudHJ5KSwgZnVucyhmb3JtYXQocm91bmQoLiwgMiksIG5zbWFsbCA9IDIpKSksCiAgICAgICAgICAgIGFlcyh5ID0gMSwgbGFiZWwgPSBwYXN0ZTAocG9yX3Njb3JlX21lYW4sICJcbigiLCBwb3Jfc2NvcmVfc2QsICIpIikpLAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUsIHZqdXN0ID0gMSkgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJQb3Jvc2l0eSBTY2FsZSIpCmBgYAoKYGBge3J9CmZpZzNfYWJzIDwtIGQ0X2ZpZyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCB5ID0gYWJzX3Njb3JlLCBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5KSkgJT4lCiAgZmlnM19mdW4oKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvdW50cnkpICU+JQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihhYnNfc2NvcmUsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QoYWJzX3Njb3JlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IG1lYW4gLSBzZCwgeW1heCA9IG1lYW4gKyBzZCksCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMjMsIGNvbG9yID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkX3N1bV9zNCAlPiUKICAgICAgICAgICAgICBtdXRhdGVfYXQodmFycygtY291bnRyeSksIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIDIpLCBuc21hbGwgPSAyKSkpLAogICAgICAgICAgICBhZXMoeSA9IDEsIGxhYmVsID0gcGFzdGUwKGFic19zY29yZV9tZWFuLCAiXG4oIiwgYWJzX3Njb3JlX3NkLCAiKSIpKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41LCB2anVzdCA9IDEpICsKICBsYWJzKHggPSAiQ291bnRyeSIsIHkgPSAiQWJzb3JwdGlvbiIpCmBgYAoKYGBge3J9CmZpZzNfc3R1ZHk0X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgNCIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwLjUpICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAzNSkpCgpmaWczIDwtIHBsb3RfZ3JpZCgKICBmaWczX3N0dWR5NF90aXRsZSwKICBwbG90X2dyaWQoZmlnM19zcGV2LCBmaWczX2RzZSwgCiAgICAgICAgICAgIGZpZzNfcHYsIGZpZzNfcG9yLCAKICAgICAgICAgICAgZmlnM19hYnMsIE5VTEwsIAogICAgICAgICAgICBuY29sID0gMiwgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMjApKQoKZ2dzYXZlKCIuL3BuZ19maWxlcy9maWczLnBuZyIsIHBsb3QgPSBmaWczLCBkZXZpY2UgPSAicG5nIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA3ICogMS41KQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAxLjV9CmZpZzMKYGBgCgpTY29yZXMgb24gbWVhc3VyZXMgb2Ygc3Bpcml0dWFsIGV4cGVyaWVuY2UgKEEtQiksIHBvcm9zaXR5IChDLUQpIGFuZCBhYnNvcnB0aW9uIChFKSBpbiBTdHVkeSA0LCByZXNjYWxlZCB0byByYW5nZSBmcm9tIDAtMS4gU21hbGwgcG9pbnRzIGNvcnJlc3BvbmQgdG8gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMsIGxhcmdlciBwb2ludHMgYXJlIG1lYW5zLCBhbmQgZXJyb3IgYmFycyBhcmUgwrExIHN0YW5kYXJkIGRldmlhdGlvbjsgbWVhbnMgKGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zKSBhcmUgYWxzbyBwcm92aWRlZC4KCgojIEZpZ3VyZSBTMQoKYGBge3J9CmZpZ3MxX3N0dWR5M19hYnMgPC0gZDNfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBkc2Vfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIkRhaWx5IFNwaXJpdHVhbCBFeHBlcmllbmNlIiwKICAgICAgIGNvbG9yID0gIkNvdW50cnkiKQoKZmlnczFfc3R1ZHk0X3B2IDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHZfc2NvcmUsIHkgPSBkc2Vfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2UiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWdzMV9zdHVkeTRfcG9yIDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcG9yX3Njb3JlLCB5ID0gZHNlX3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgIHkgPSAiRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2UiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWdzMV9zdHVkeTRfYWJzIDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWJzX3Njb3JlLCB5ID0gZHNlX3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIkFic29ycHRpb24iLAogICAgICAgeSA9ICJEYWlseSBTcGlyaXR1YWwgRXhwZXJpZW5jZSIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKYGBgCgpgYGB7cn0KZmlnczFfc3R1ZHkzX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU1RVRFkgMyIsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKSArCiAgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgNykpCgpmaWdzMV9zdHVkeTRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTVFVEWSA0IiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCA3KSkKCmZpZ3MxX3JvdzEgPC0gcGxvdF9ncmlkKAogIHBsb3RfZ3JpZChmaWdzMV9zdHVkeTRfdGl0bGUsIGZpZ3MxX3N0dWR5M190aXRsZSksCiAgcGxvdF9ncmlkKGZpZ3MxX3N0dWR5NF9wdiwgZmlnczFfc3R1ZHkzX2FicywgbmNvbCA9IDIsIGxhYmVscyA9IGMoIkEiLCAiQiIpKSwKICBwbG90X2dyaWQoZmlnczFfc3R1ZHk0X3RpdGxlLCBmaWdzMV9zdHVkeTRfdGl0bGUpLAogIHBsb3RfZ3JpZChmaWdzMV9zdHVkeTRfcG9yLCBmaWdzMV9zdHVkeTRfYWJzLCBuY29sID0gMiwgbGFiZWxzID0gYygiQyIsICJEIikpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMTAsIDEsIDEwKSkKYGBgCgpgYGB7cn0KZmlnX2xlZ2VuZCA8LSBnZXRfbGVnZW5kKGZpZ3MxX3N0dWR5NF9wdiArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKYGBgCgpgYGB7cn0KZmlnczEgPC0gcGxvdF9ncmlkKGZpZ3MxX3JvdzEsIGZpZ19sZWdlbmQsCiAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDAuMikpCgpnZ3NhdmUoIi4vcG5nX2ZpbGVzL2ZpZ3MxLnBuZyIsIHBsb3QgPSBmaWdzMSwgZGV2aWNlID0gInBuZyIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNiAqIDEuMikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDEuMn0KZmlnczEKYGBgCgpSZWxhdGlvbnNoaXBzIGJldHdlZW4gRGFpbHkgU3Bpcml0dWFsIEV4cGVyaWVuY2Ugc2NvcmVzIGFuZCBzY29yZXMgb24gb3VyIG1lYXN1cmVzIG9mIHBvcm9zaXR5IChsZWZ0IHNpZGUpIGFuZCBhYnNvcnB0aW9uIChyaWdodCBzaWRlKSwgYnkgc3R1ZHkgYW5kIGNvdW50cnksIHJlc2NhbGVkIHRvIHJhbmdlIGZyb20gMC0xLiBTbWFsbCBjb2xvcmVkIHBvaW50cyBjb3JyZXNwb25kIHRvIGluZGl2aWR1YWwgcGFydGljaXBhbnRzLCBkb3R0ZWQgY29sb3JlZCBsaW5lcyBjb3JyZXNwb25kIHRvIHRoZSB0cmVuZCB3aXRoaW4gZWFjaCBjb3VudHJ5LCBhbmQgc29saWQgYmxhY2sgbGluZXMgY29ycmVzcG9uZCB0byB0aGUgb3ZlcmFsbCB0cmVuZCwgY29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzLgoKCiMgRmlndXJlIFMyCgpgYGB7cn0KZmlnczJfc3R1ZHk0X3B2X2hhbGwgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwdl9zY29yZSwgeSA9IGhhbGxfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiUG9yb3NpdHkgVmlnbmV0dGVzIiwKICAgICAgIHkgPSAiSGFsbHVjaW5hdGlvbnMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWdzMl9zdHVkeTRfcG9yX2hhbGwgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3Jfc2NvcmUsIHkgPSBoYWxsX3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgIHkgPSAiSGFsbHVjaW5hdGlvbnMiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWdzMl9zdHVkeTRfYWJzX2hhbGwgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBoYWxsX3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIkFic29ycHRpb24iLAogICAgICAgeSA9ICJIYWxsdWNpbmF0aW9ucyIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZ3MyX3N0dWR5NF9wdl9wYXJhIDwtIGQ0X2ZpZyAlPiUKICAjIG11dGF0ZV9hdCh2YXJzKGVuZHNfd2l0aCgiX3Njb3JlIikpLCBzY2FsZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHZfc2NvcmUsIHkgPSBwYXJhX3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFZpZ25ldHRlcyIsCiAgICAgICB5ID0gIlBhcmFub3JtYWwiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCgpmaWdzMl9zdHVkeTRfcG9yX3BhcmEgPC0gZDRfZmlnICU+JQogICMgbXV0YXRlX2F0KHZhcnMoZW5kc193aXRoKCJfc2NvcmUiKSksIHNjYWxlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwb3Jfc2NvcmUsIHkgPSBwYXJhX3Njb3JlKSkgJT4lCiAgZmlnMl9mdW4oKSArCiAgbGFicyh4ID0gIlBvcm9zaXR5IFNjYWxlIiwKICAgICAgIHkgPSAiUGFyYW5vcm1hbCIsCiAgICAgICBjb2xvciA9ICJDb3VudHJ5IikKCmZpZ3MyX3N0dWR5NF9hYnNfcGFyYSA8LSBkNF9maWcgJT4lCiAgIyBtdXRhdGVfYXQodmFycyhlbmRzX3dpdGgoIl9zY29yZSIpKSwgc2NhbGUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHBhcmFfc2NvcmUpKSAlPiUKICBmaWcyX2Z1bigpICsKICBsYWJzKHggPSAiQWJzb3JwdGlvbiIsCiAgICAgICB5ID0gIlBhcmFub3JtYWwiLAogICAgICAgY29sb3IgPSAiQ291bnRyeSIpCmBgYAoKYGBge3J9CmZpZ3MyX3N0dWR5NF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlNUVURZIDQiLCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDcpKQoKZmlnczJfcm93MSA8LSBwbG90X2dyaWQoCiAgcGxvdF9ncmlkKGZpZ3MyX3N0dWR5NF90aXRsZSksCiAgcGxvdF9ncmlkKGZpZ3MyX3N0dWR5NF9wdl9oYWxsLCBmaWdzMl9zdHVkeTRfcG9yX2hhbGwsIGZpZ3MyX3N0dWR5NF9hYnNfaGFsbCwKICAgICAgICAgICAgbmNvbCA9IDMsIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIikpLAogIHBsb3RfZ3JpZChmaWdzMl9zdHVkeTRfcHZfcGFyYSwgZmlnczJfc3R1ZHk0X3Bvcl9wYXJhLCBmaWdzMl9zdHVkeTRfYWJzX3BhcmEsCiAgICAgICAgICAgIG5jb2wgPSAzLCBsYWJlbHMgPSBjKCJEIiwgIkUiLCAiRiIpKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEwLCAxMCkpCmBgYAoKYGBge3J9CmZpZ19sZWdlbmQgPC0gZ2V0X2xlZ2VuZChmaWdzMl9zdHVkeTRfcHZfcGFyYSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSkKYGBgCgpgYGB7cn0KZmlnczIgPC0gcGxvdF9ncmlkKGZpZ3MyX3JvdzEsIGZpZ19sZWdlbmQsCiAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDMsIDAuMikpCgpnZ3NhdmUoIi4vcG5nX2ZpbGVzL2ZpZ3MyLnBuZyIsIHBsb3QgPSBmaWdzMiwgZGV2aWNlID0gInBuZyIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSAqIDAuNykKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuN30KZmlnczIKYGBgCgpSZWxhdGlvbnNoaXBzIGJldHdlZW4gUGFyYW5vcm1hbCBzY29yZXMgYW5kIHNjb3JlcyBvbiBvdXIgbWVhc3VyZXMgb2YgcG9yb3NpdHkgKGxlZnQgc2lkZSkgYW5kIGFic29ycHRpb24gKHJpZ2h0IHNpZGUpLCBieSBzdHVkeSBhbmQgY291bnRyeSwgcmVzY2FsZWQgdG8gcmFuZ2UgZnJvbSAwLTEuIFNtYWxsIGNvbG9yZWQgcG9pbnRzIGNvcnJlc3BvbmQgdG8gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMsIGRvdHRlZCBjb2xvcmVkIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhlIHRyZW5kIHdpdGhpbiBlYWNoIGNvdW50cnksIGFuZCBzb2xpZCBibGFjayBsaW5lcyBjb3JyZXNwb25kIHRvIHRoZSBvdmVyYWxsIHRyZW5kLCBjb2xsYXBzaW5nIGFjcm9zcyBjb3VudHJpZXMuCgoKCgo=